<?php
use function Hyperf\Support\env;
// 应用公共文件

/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key 加密密钥
 * @param int $expire 过期时间 单位 秒
 * @return string
 */
function think_encrypt($data, $key = '', $expire = 0)
{
    $key  = md5(empty($key) ? env('PASS_SALT','pass_salt') : $key);
    $data = base64_encode($data);
    $x    = 0;
    $len  = strlen($data);
    $l    = strlen($key);
    $char = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    $str = sprintf('%010d', $expire ? $expire + time() : 0);

    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1))) % 256);
    }

    $str = str_replace(array('+', '/', '='), array('-', '_', ''), base64_encode($str));
    return strtoupper(md5($str)) . $str;
}

/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param  string $key 加密密钥
 * @return string
 */
function think_decrypt($data, $key = '')
{
    $key  = md5(empty($key) ? env('PASS_SALT', 'pass_salt') : $key);
    $data = substr($data, 32);
    $data = str_replace(array('-', '_'), array('+', '/'), $data);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    $data   = base64_decode($data);
    $expire = substr($data, 0, 10);
    $data   = substr($data, 10);

    if ($expire > 0 && $expire < time()) {
        return '';
    }
    $x    = 0;
    $len  = strlen($data);
    $l    = strlen($key);
    $char = $str = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return base64_decode($str);
}

/**
 * 用户密码加密方法，可以考虑盐值包含时间（例如注册时间），
 * @param string $pass 原始密码
 * @return string 多重加密后的32位小写MD5码
 */
function encrypt_pass($pass)
{
    if ('' == $pass) {
        return '';
    }
    $salt = env('PASS_SALT', 'pass_salt');
    return md5(sha1($pass) . $salt);
}

/**
 * Notes:手机号脱敏
 * 2025/7/10
 * @param string $mobile 手机号
 * @return string
 */
if (!function_exists('maskMobile')) {
    function maskMobile(string $mobile): string
    {
        $length = strlen($mobile);
        // 判断是否为 11 位或 15 位手机号
        if (!in_array($length, [11, 15])) {
            return $mobile;
        }
        // 根据不同长度做脱敏处理
        if ($length === 11) {
            return substr($mobile, 0, 3) . '****' . substr($mobile, 7);
        }elseif ($length === 15) {
            return substr($mobile, 0, 4) . '******' . substr($mobile, 10);
        }else{
            return $mobile;
        }
    }
}

if (!function_exists('trees')) {
    /**
     * 将菜单遍历为树形式.
     * @param array $lists
     * @param int $pid
     * @return array
     */
    function trees(array $lists, $pid = 0): array
    {
        $arr = [];
        foreach ($lists as $list) {
            if ($pid == $list['pid']) {
                $child = trees($lists, $list['id']);
                if (!empty($child)) {
                    $list['children'] = $child;
                }
                $arr[] = $list;
            }
        }
        return $arr;
    }
}

/**
 * 获取浏览器类型.
 */
if (!function_exists('getBrowserInfo')) {
    function getBrowserInfo(string $userAgent): string
    {
        if (stripos($userAgent, 'Firefox/') > 0) {
            preg_match('/Firefox\\/([^;)]+)+/i', $userAgent, $b);
            $exp[0] = 'Firefox';
            $exp[1] = $b[1];    //获取火狐浏览器的版本号
        } elseif (stripos($userAgent, 'Maxthon') > 0) {
            preg_match('/Maxthon\\/([\\d.]+)/', $userAgent, $aoyou);
            $exp[0] = '傲游';
            $exp[1] = $aoyou[1];
        } elseif (stripos($userAgent, 'MSIE') > 0) {
            preg_match('/MSIE\\s+([^;)]+)+/i', $userAgent, $ie);
            $exp[0] = 'IE';
            $exp[1] = $ie[1];  //获取IE的版本号
        } elseif (stripos($userAgent, 'OPR') > 0) {
            preg_match('/OPR\\/([\\d.]+)/', $userAgent, $opera);
            $exp[0] = 'Opera';
            $exp[1] = $opera[1];
        } elseif (stripos($userAgent, 'Edge') > 0) {
            //win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
            preg_match('/Edge\\/([\\d.]+)/', $userAgent, $Edge);
            $exp[0] = 'Edge';
            $exp[1] = $Edge[1];
        } elseif (stripos($userAgent, 'Chrome') > 0) {
            preg_match('/Chrome\\/([\\d.]+)/', $userAgent, $google);
            $exp[0] = 'Chrome';
            $exp[1] = $google[1];  //获取google chrome的版本号
        } elseif (stripos($userAgent, 'rv:') > 0 && stripos($userAgent, 'Gecko') > 0) {
            preg_match('/rv:([\\d.]+)/', $userAgent, $IE);
            $exp[0] = 'IE';
            $exp[1] = $IE[1];
        } else {
            $exp[0] = '未知浏览器';
            $exp[1] = '';
        }
        return $exp[0] . '(' . $exp[1] . ')';
    }
}

/**
 * 获取操作系统类型.
 */
if (!function_exists('getOs')) {
    function getOs(string $userAgent): string
    {
        $os = '';
        if (preg_match('/win/i', $userAgent) && preg_match('/nt 10.0/i', $userAgent)) {
            $os = 'Windows 10'; #添加win10判断
        } elseif (preg_match('/win/i', $userAgent) && preg_match('/nt 5/i', $userAgent)) {
            $os = 'Windows 2000';
        } elseif (preg_match('/win/i', $userAgent) && preg_match('/nt/i', $userAgent)) {
            $os = 'Windows NT';
        } elseif (preg_match('/linux/i', $userAgent)) {
            $os = 'Linux';
        } elseif (preg_match('/unix/i', $userAgent)) {
            $os = 'Unix';
        } elseif (preg_match('/sun/i', $userAgent) && preg_match('/os/i', $userAgent)) {
            $os = 'SunOS';
        } elseif (preg_match('/ibm/i', $userAgent) && preg_match('/os/i', $userAgent)) {
            $os = 'IBM OS/2';
        } elseif (preg_match('/Mac/i', $userAgent) && preg_match('/Macintosh/i', $userAgent)) {
            $os = 'Mac';
        } elseif (preg_match('/PowerPC/i', $userAgent)) {
            $os = 'PowerPC';
        } elseif (preg_match('/AIX/i', $userAgent)) {
            $os = 'AIX';
        } elseif (preg_match('/HPUX/i', $userAgent)) {
            $os = 'HPUX';
        } elseif (preg_match('/NetBSD/i', $userAgent)) {
            $os = 'NetBSD';
        } elseif (preg_match('/BSD/i', $userAgent)) {
            $os = 'BSD';
        } elseif (preg_match('/OSF1/i', $userAgent)) {
            $os = 'OSF1';
        } elseif (preg_match('/IRIX/i', $userAgent)) {
            $os = 'IRIX';
        } elseif (preg_match('/FreeBSD/i', $userAgent)) {
            $os = 'FreeBSD';
        } elseif (preg_match('/teleport/i', $userAgent)) {
            $os = 'teleport';
        } elseif (preg_match('/flashget/i', $userAgent)) {
            $os = 'flashget';
        } elseif (preg_match('/webzip/i', $userAgent)) {
            $os = 'webzip';
        } elseif (preg_match('/offline/i', $userAgent)) {
            $os = 'offline';
        } else {
            $os = '未知操作系统';
        }

        return $os;
    }
}